<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>寄生组合继承</title>
</head>
<body>
    <script>
        /**
        * 寄生组合继承（经典继承）
        * 缺陷：重写Sub.Prototype/原型，会导致之前原型对象被覆盖，导致属性或方法丢失
        **/
        function Supper() {
            this.a = '111';
            this.b = [1, 2, 3, 4]
        }

        Supper.prototype = {
            say: function(){
                console.log('222');
            },
            c: '444'
        }

        function Sub() {

            // 构造函数继承
            Supper.call(this)
        }
        // 因为重写的Sub的原型，
        // 会被覆盖
        // Sub.prototype = {
        //     ts: 10
        // }

        // Object.create()[es5的方法] 返回一个对象
        // Sub.prototype（Sub的原型）直接继承到Supper.prototype（Supper的原型）
        // 因为Object.create()是es5的api，因此需要做优化
        if(!Object.create){
            Object.create = function(prototype) {
                function F() {}
                F.prototype = prototype
                return new F();
            }
        }
        Sub.prototype = Object.create(Supper.prototype);
        var sub1 = new Sub();

        sub1.a = '333';
        sub1.b.push(5)
        
        sub1.say(); // 222
        // console.log(sub1.c); // 444
        console.log(sub1);
        var sub2 = new Sub();

        // console.log(sub1.a); // 333
        // console.log(sub2.a); // 111

        // console.log(sub1.b); // [1, 2, 3, 4, 5]
        // console.log(sub2.b); // [1, 2, 3, 4]
    </script>
</body>
</html>